ES6 的新特性
1. 数组的拓展
数组的方法
array.concat(array1, array2,…arrayN)
合并多个数组,返回合并后的新数组,原数组没有变化。array.every(callback[, thisArg])
检测数组中的每一个元素是否都通过了 callback 测试,全部通过返回 true,否则返回 false。array.filter(callback[, thisArg])
返回一个新数组,包含通过 callback 函数测试的所有元素。(callback 定义,三个参数: element:当前元素值;index:当前元素下标; array:当前数组)array.find(callback[, thisArg])
返回通过 callback 函数测试的第一个元素,否则返回 undefined,callback 函数定义同上。array.findIndex(callback[, thisArg])
返回通过 callback 函数测试的第一个元素的索引,否则返回-1,callback 函数定义同上。array.includes(searchElement, fromIndex)
includes() 方法用来判断一个数组是否包含一个指定的值,返回 true 或 false。searchElement:要查找的元素;fromIndex:开始查找的索引位置。array.indexOf(searchElement[, fromIndex = 0])
返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。searchElement:要查找的元素;fromIndex:开始查找的索引位置。array.join(separator=',')
将数组中的元素通过 separator 连接成字符串,并返回该字符串,separator 默认为”,”。array.map(callback[, thisArg])
返回一个新数组,新数组中的每个元素都是调用 callback 函数后返回的结果。注意:如果没有 return 值,则新数组会插入一个 undefined 值。array.map 由于不具有过滤的功能,因此 array 调用 map 函数时,如果 array 中的数据并不是每一个都会 return,则必须先 filter,然后再 map,即 map 调用时必须是对数组中的每一个元素都有效。array.pop() 与 array.shift()
pop 为从数组中删除最后一个元素,并返回最后一个元素的值,原数组的最后一个元素被删除。数组为空时返回 undefined。shift 删除数组的第一个元素,并返回第一个元素,原数组的第一个元素被删除。数组为空返回 undefined。array.push(element1, element2, ....elementN) 与 array.unshift(element1, element2, ...elementN)
push 是将一个或多个元素添加到数组的末尾,并返回新数组的长度; unshift 将一个或多个元素添加到数组的开头,并返回新数组的长度。唯一的区别就是插入的位置不同。array.reduce(callback[, initialValue])
对数组中的每个元素(从左到右)执行 callback 函数累加,将其减少为单个值。array.reverse()
将数组中元素的位置颠倒。array.slice(begin, end)
返回一个新数组,包含原数组从 begin 到 end(不包含 end)索引位置的所有元素。array.some(callback[, thisArg])
判断数组中是否包含可以通过 callback 测试的元素,与 every 不同的是,这里只要某一个元素通过测试,即返回 true。callback 定义同上。array.sort([compareFunction])
对数组中的元素进行排序,compareFunction 不存在时,元素按照转换为的字符串的诸个字符的 Unicode 位点进行排序,慎用!请使用时一定要加 compareFunction 函数,而且该排序是不稳定的。array.splice(start[, deleteCount, item1, item2, ...])
通过删除现有元素和/或添加新元素来更改一个数组的内容。start:指定修改的开始位置;deleteCount:从 start 位置开始要删除的元素个数;item…:要添加进数组的元素,从 start 位置开始。返回值是由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
注:push、 shift、 pop、 unshift、 reverse、 sort、 splice 方法会对原来的数组进行修改,其他的数组操作方法只有返回值不同,对原数组都没有影响,即原数组不变。
ES6 中对数组的扩展
Array.from() : 将伪数组对象或可遍历对象转换为真数组
Array.of(v1, v2, v3) : 将一系列值转换成数组。
当使用单个数值参数来调用 Array 构造器时,数组的长度属性会被设置为该参数。 如果使用多个参数(无论是否为数值类型)来调用,这些参数也会成为目标数组的项。数组的这种行为既混乱又有风险,因为有时可能不会留意所传参数的类型。
Array.of( )方法总会创建一个包含所有传入参数的数组,而不管参数的数量与类型
1
2
3
4
5
6
7let items = Array.of(1, 2);
console.log(items.length); // 2
console.log(items[0]); // 1
console.log(items[1]); // 2
items = Array.of(2);
console.log(items.length); // 1
console.log(items[0]); // 2Array.of 基本上可以用来替代 Array()或 newArray(),并且不存在由于参数不同而导致的重载,而且他们的行为非常统一。
数组实例的 find() 和 findIndex()
find 方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为 true 的成员,然后返回该成员。如果没有符合条件的成员,则返回 undefined。
1
[1, 4, -5, 10].find(n => n < 0); // -5
findIndex 方法的用法与 find 方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
1
2
3[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}); // 2数组实例的 includes()
Array.prototype.includes 方法返回一个布尔值,表示某个数组是否包含给定的值。该方法的第二个参数表示搜索的起始位置,默认为 0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为 3),则会重置为从 0 开始。
1
2
3
4[1, 2, 3]
.includes(2) // true
[(1, 2, 3)].includes(3, -1); // true
[1, 2, 3, 5, 1].includes(1, 2); // true没有该方法之前,我们通常使用数组的 indexOf 方法,检查是否包含某个值。它内部使用严格相等运算符(===)进行判断,这会导致对 NaN 的误判。
1
2
3[NaN]
.indexOf(NaN) // -1
[NaN].includes(NaN); // true数组实例的 entries(),keys() 和 values()
它们都返回一个遍历器对象,可以用 for…of 循环进行遍历,唯一的区别是 keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17for (let index of ["a", "b"].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ["a", "b"].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ["a", "b"].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
2. 箭头函数
- 缩减代码和改变 this 指向
- 使用注意点:
- 函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。
- 不可以当作构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误。
- 不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
- 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。
3. rest 参数
- 用于获取函数的多余参数,这样就不需要使用 arguments 对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
- 注意点:
- 每个函数最多只能声明一个 rest 参数,而且 rest 参数必须是最后一个参数,否则报错。
- rest 参数不能用于对象字面量 setter 之中
4. 展开运算符
剩余参数允许你把多个独立的参数合并到一个数组中;而扩展运算符则允许将一个数组分割,并将各个项作为分离的参数传给函数。
5. 解构赋值—-更方便的数据访问
6. 模板字符串
用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。模板字符串中嵌入变量和函数,需要将变量名写在${}之中。
7. class 类
8. promise
9. Iterator 和 for…of 循环
JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 添加了 Map 和 Set。
任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
- Iterator 的作用:
- 为各种数据结构,提供一个统一的、简便的访问接口;
- 使得数据结构的成员能够按某种次序排列
- ES6 创造了一种新的遍历命令 for…of 循环,Iterator 接口主要供 for…of 消费。
- 原生具备 iterator 接口的数据(可用 for of 遍历)
- Array
- set 容器
- map 容器
- String
- 函数的 arguments 对象
- NodeList 对象
- 几种遍历方式比较
- for of 循环不仅支持数组、大多数伪数组对象,也支持字符串遍历,此外还支持 Map 和 Set 对象遍历
- for in 循环可以遍历字符串、对象、数组,不能遍历 Set/Map
- forEach 循环不能遍历字符串、对象,可以遍历 Set/Map
10. ES6 模块化
其模块功能主要由两个命令构成:export 和 import。export 命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能。